package com.linwen.javase.thread;

import org.junit.Test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 线程创建的方式1：继承Thread类
 * 一个对象只能调用一次start方法，否则会报IllegalThreadStateException错误
 * @author : linwen
 * @date : 下午1:18 2021/1/10
 * Thread中常用方法：
 *  1：run() 线程中执行的方法
 *  2：start() 启动线程，执行线程中的run方法
 *  3：currentThread()静态方法，获取当前线程
 *  4：getName() 获取线程名
 *  5：setName() 设置线程名
 *  6: yield() 释放当前线程的使用权，但是可能下一次又会获取到
 *  7：join() 阻塞当前线程，直到join的线程执行完毕.
 *  8: stop() 过时的，结束执行当前线程
 *  9：sleep() 休眠当前线程，单位为毫秒
 *  10：isAlive() 判断当前线程是否存活
 *
 *  创建多线程的方式二：实现Runnable接口
 *
 *  创建多线程的方式三：实现Callnable接口
 *
 */
public class ThreadTest {
    @Test
    public void testExtendsThread(){
        MyClass myClass = new MyClass();
        myClass.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
            if(i==50){
                try {
                    myClass.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void testImplementsRunnable(){
        MyClass2 myClass2 = new MyClass2();
        Thread thread = new Thread(myClass2);
        thread.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"="+i);
        }
    }

    @Test
    public void testImplementsCallable(){
        MyClass3 myClass3 = new MyClass3();
        FutureTask futureTask = new FutureTask(myClass3);
        Thread thread = new Thread(futureTask);
        thread.setName("callable线程");
        thread.start();

        try {
            Object sum = futureTask.get();
            System.out.println(Thread.currentThread().getName()+"获得总和为："+sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}
class MyClass extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+" = " + i);
        }

    }
}
class MyClass2 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+" = " + i);
        }
    }
}

class MyClass3 implements Callable{

    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+i);
            sum += i;
        }
        return sum;
    }
}
